iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
自我挑戰組

學習JavaScript的基礎概念系列 第 14

Day14 提升hoisting

  • 分享至 

  • xImage
  •  

提升(hoisting)

是在創造階段被設定,設定var變數和函數分配到記憶體裡,這個步驟叫提升(hoisting),它不是真的把你的程式碼移到最上面。

這表示在逐個執行程式碼之前,JS已經將變數、函數在記憶體中建立一個空間了,所以變數和函數已經存在於記憶體中,當程式被逐個執行時,即可以找到它們。

var 沒有block scope,會考慮到hoisting
let,const 有block scope,沒有hoisting

https://imgur.com/qsCm5Gt.jpg

這裡先示範有提升(hoisting)的部分

var a ='Hello World!';

function b (){
    console.log('Called b!');
}

b();
console.log(a);

執行結果
https://imgur.com/i8Goqzp.jpg


先呼叫,函數之後才宣告

b(); 
console.log(a);

var a ='Hello World!';

function b (){ 
    console.log('Called b!'); 
} 

執行結果
https://imgur.com/alrrDGF.jpg


但變數的情況又有點不同
例:
把宣告a拿掉

b();
console.log(a);

function b (){
    console.log('Called b!');
}

執行結果
https://imgur.com/9XCZ2zg.jpg

var宣告的變數的情況有點不同,a空出記憶體時,JS不知道它是什麼值,直到它被執行才知道,因此它會放上undfined的替代文字,表示「JS還不知道的值」,值還未被設定

所有JavaScript的變數 一開始都會被設定為undefined,函數則是被設定好放進記憶體中。
因此即使一個函數之後才宣告,我們依然可以先呼叫,因為這些東西已經在記憶體裡了。

不同宣告方式的結果也不同

要注意一開始的記憶體會分配給var變數,但不會給let 和const
例:
var宣告但不給值

var a;
console.log(a);

執行結果undefined

例2:
let宣告但不給值

let x;
console.log(x);

執行結果undefined

例3:
const宣告但不給值

const y;
console.log(y);

執行結果出現錯誤


例:
var 在if內宣告

if(true){
    var x = 10;
    console.log(x);
}
console.log(x);

執行結果
https://imgur.com/SuUCk6w.jpg


例:
const 在if內宣告

if(true){
    const x = 10;
    console.log(x);
}
console.log(x);

執行結果,const和let結果都會一樣
https://imgur.com/3HHOhxj.jpg


小叮嚀:

建議不要將變數的值設定為undefined,可能會讓你搞混!


上一篇
Day 13 JavaScript的宣告方式 let 、const、var
下一篇
Day15 純值 和 運算子優先性、相依性
系列文
學習JavaScript的基礎概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言